
/**
 * 类类型：{new(构造函数形参): 类名}
 *
 * 
 */

export class MCCTypeInstance {
    public static readonly Instance: MCCTypeInstance = new MCCTypeInstance();
    private constructor() {}
    initMCCType(): void {

        this.cctype1Class(CCType1);
        this.cctype2Class(CCType2);

        this.cctype4Class(CCType1Sub);
    }


    // 1.类类型形参：CCType1构造函数无形参
    cctype1Class( classType1:{ new(): CCType1} ): void {
        new classType1().testType1();
    }
    // 2.类类型形参：CCType2构造函数带形参
    cctype2Class(classType2: { new(name: string): CCType2 }): void {
        new classType2('cctype2Class').testType2();
    }

    // 3.返回类类型数组
    cctype3Class(): { new (): CCType1 }[] {
        return [CCType1];
    }

    //4.子类 类类型 赋值给父类
    cctype4Class(classType1: { new(): CCType1 }): void {
        new classType1().testFunc();//调用子类方法
    }   
}


class CCType1 {
    constructor() {
        console.log('CCType1 构造函数');
    }

    testType1() {
        console.log('CCType1 testType1')
    }

    testFunc() {
        console.log('父类CCType1 testFunc')
    }
};


class CCType2 {
    constructor(name2: string) {
        console.log('CCType2 构造函数:' + name2);
    }

    testType2() {
        console.log('CCType2 testType2')
    }
};


class CCType1Sub extends CCType1 {
    testFunc() {
        console.log('子类CCType1Sub testFunc')
    }
}


export const MCCType = MCCTypeInstance.Instance;